/*
 * @Description: 
 * @Version: 0.1
 * @Autor: 宣某
 * @Date: 2021-04-14 14:17:50
 * @FilePath: \mt_current\System\Protocol\cmd_process.c
 * @LastEditors: 许振富(jia)
 * @LastEditTime: 2023-03-01 13:46:33
 */

#include "../ASM_Delay/ASM_Delay.h"
#include "Protocol.h"
#include "cmd_process.h"

#include "RTT_Log.h"

#include "../eeprom/eeprom.h"
#include "../Soft_Timer/Soft_Timer.h"
#include "../hlk_protocol/zw0906_protocol.h"
#include "../hlk_protocol/zw0906_cmd.h"
#include "hw_gpiomap.h"

#include "string.h"

extern volatile uint32_t SysTickNum;
#define CMD_PROCESS_GET_TICK()    SysTickNum
//机器版本号
uint8_t mt3yverson[] = "MT500-EM-A39E17 V1.13";

/*--------------------------------------------------------
*声明命令函数
*格式为 void 注册的命令名##__Funtion (__protocol_buf *_Rx);
*-------------------------------------------------------*/
void CMD_GET_IAP_VERSON_Funtion(__protocol_buf *_Rx);	/* 版本信息 升级用 */
void CMD_ENTER_IAP_Funtion(__protocol_buf *_Rx);		/* 进入升级接口*/
void CMD_RD_VERSON_Funtion(__protocol_buf *_Rx);		/* 读设备版本号*/
void CMD_SET_PC_BAUDRATE_Funtion(__protocol_buf *_Rx);	/* 设置串口通讯波特率 */
void CMD_RD_STATUS_Funtion(__protocol_buf *_Rx);		/* 查询设备状态 */
void CMD_NFC_URL_Funtion(__protocol_buf *_Rx);		/* 查询设备状态 */

//注册命令
const __CMD_HANDLER CMD_HANDLER_List[] =
	{
		CMD(CMD_GET_IAP_VERSON),   /* 版本信息 升级用 */
		CMD(CMD_ENTER_IAP),		   /* 进入升级接口*/
		CMD(CMD_RD_VERSON),		   /* 读设备版本号 */
		CMD(CMD_SET_PC_BAUDRATE),  /* 设置串口通讯波特率 */
		CMD(CMD_NFC_URL),

};
//记录已注册的命令数量
const unsigned short MAX_CMD_NUMBER = sizeof(CMD_HANDLER_List) / sizeof(__CMD_HANDLER);


void CMD_GET_IAP_VERSON_Funtion(__protocol_buf *_Rx) /* 版本信息 升级用 */
{
	Protocol_RePort(0x00, mt3yverson, sizeof(mt3yverson) - 1);
}
/**
 * @brief 进入升级接口 CMD_GET_IAP_VERSON
 * 
 * @param _Rx 
 */
void CMD_ENTER_IAP_Funtion(__protocol_buf *_Rx)
{
	//向上位机返回成功,防止软件卡住
	Protocol_RePort(0x0000, (void *)0, 0);

	ASM_DELAY_MS(20);
	FLASH_Unlock();
	if(FLASH_COMPLETE == FLASH_ErasePage(0x08004000-0x400))//清除下载状态标志和完整性标志
	{
		//设置下载状态标志
		if(FLASH_ProgramHalfWord(0x08004000-0x400, 0xa5a5)==FLASH_COMPLETE)
		{
			__set_FAULTMASK(1);      // 关闭所有中端
			NVIC_SystemReset();// 软件复位
		}
	}
}
/**
 * @brief  读设备版本号
 * 
 * @param _Rx 
 */
void CMD_RD_VERSON_Funtion(__protocol_buf *_Rx) 
{
	uint8_t temp[100];
	uint16_t return_sta = 0; //返回状态
	uint16_t return_len = 0; //返回长度

	memcpy(temp,"\x00\x00\x06\x10\x6c\x00\x00\x00\x00\x00\x02\x01\x01\x10\x31\x31\x30\x34\x19",19);
	memcpy(&temp[19], mt3yverson, sizeof(mt3yverson) - 1);
	return_len = sizeof(mt3yverson) - 1 + 19;
	Protocol_RePort(return_sta, &temp[2], return_len - 2);
}
/**
 * @brief 设置串口通讯波特率
 * 
 * @param _Rx 
 */
void CMD_SET_PC_BAUDRATE_Funtion(__protocol_buf *_Rx) 
{
	// //获取设置串口通讯波特率数据结构体
	// #pragma pack(1)
	// struct
	// {
	// 	/* 功能模块 00H：接触式	01H：非接触式 */
	// 	uint8_t Function_Module; 
	// 	/* 设置波特率的编号 0： 9600bps（默认设置）1： 19200bps2： 38400bps3： 57600bps4： 115200bps */
	// 	uint16_t Baud;	
	// } *PC_BAUD_Param = (void *)_Rx->Data; 
	// #pragma pack()
	// uint16_t temp = 0;
	// uint16_t return_sta = 0; //返回状态
	// uint16_t return_len = 0; //返回长度
	// uint16_t Baud_temp = 0;	
	// unsigned int Boud = 115200;
	// /* 记录下发的波特率 */
	// temp = PC_BAUD_Param->Baud;
	// /* 先按原来的波特率回复上位机 */
	// Protocol_RePort(return_sta, (void *)0, return_len);
	// ASM_DELAY_MS(50);
	// /* 读取EE中记录的波特率编号 */
	// EE_ReadVariable(VirtAddVarTab[EE_PC_BOUD], &Baud_temp); 
	// /* EE中记录的波特率编号与设置的不同 */
	// if (Baud_temp != temp)
	// {
	// 	/* 将新的参数设置下去 */
	// 	Baud_temp = temp;

	// 	switch(Baud_temp)
	// 	{
	// 		case 0:Boud = (9600);break;
	// 		case 1:Boud = (19200);break;
	// 		case 2:Boud = (38400);break;
	// 		case 3:Boud = (57600);break;
	// 		case 4:Boud = (115200);break;
	// 		case 5:Boud = (128000);break;
	// 		case 6:Boud = (256000);break;
	// 		default:Boud = (115200);break;
	// 	}	
	// 	Uart_protocol.Set_Baud(Boud);
	// 	FLASH_Unlock();    
	// 	EE_WriteVariable(VirtAddVarTab[EE_PC_BOUD], Baud_temp);
	// 	FLASH_Lock();
	// }
	
}



/**
 * @brief 写EEPROM
 * 
 * @param _Rx 
 */
void CMD_WR_EEPROM_Funtion(__protocol_buf *_Rx) 
{
	struct
	{
		uint16_t Addr;
		uint16_t Len;
		uint8_t Data[200];
	}*WR_EEPROM_Param = (void*)_Rx->Data;
	unsigned short i = 0;
	unsigned short Length = 0;
	unsigned short Status = 0;
	/* 这个ADDR的高位是不用的 */
	_Rx->Data[0] = 0;
	/* 调整数据大小端 */
	WR_EEPROM_Param->Addr = __REV16(WR_EEPROM_Param->Addr);
	WR_EEPROM_Param->Len = __REV16(WR_EEPROM_Param->Len);
	/* ST 的 FLASH_EE单次写入2字节 */
	// WR_EEPROM_Param->Len /= 2;
	// FLASH_Unlock();
	// for (i = 0; i < WR_EEPROM_Param->Len; i++)
	// { 
	// 	Status = EE_WriteVariable(VirtAddVarTab[WR_EEPROM_Param->Addr + EE_DA_START + i], 
	// 											(WR_EEPROM_Param->Data[i*2] << 8) + WR_EEPROM_Param->Data[i*2+1]);
	// 	if (Status != 0x04)
	// 		break;
	// }
	// FLASH_Lock();

	if (Status != 0x04)
	{
		Protocol_RePort(0x0002, (void *)0, 0);
	}
	else
	{
		Protocol_RePort(0x0000, (void *)0, 0);
	}
}
/**
 * @brief 读EEPROM
 * 
 * @param _Rx 
 */
void CMD_RD_EEPROM_Funtion(__protocol_buf *_Rx) 
{
	struct
	{
		uint16_t Addr;
		uint16_t Len;
	}*RD_EEPROM_Param = (void*)_Rx->Data;
	/* 这个ADDR的高位是不用的 */
	_Rx->Data[0] = 0;
	/* 调整数据大小端 */
	RD_EEPROM_Param->Addr = __REV16(RD_EEPROM_Param->Addr);
	RD_EEPROM_Param->Len = __REV16(RD_EEPROM_Param->Len);
	uint16_t  read_tmp = 0;
	uint8_t i = 0;
	uint8_t reclen;
	uint8_t readdata[256];
	/* ST 的 FLASH_EE单次读取2字节 */
	RD_EEPROM_Param->Len /= 2;
	// for (i = 0; i < RD_EEPROM_Param->Len; i++)
	// {
	// 	EE_ReadVariable(VirtAddVarTab[EE_DA_START + RD_EEPROM_Param->Addr+i], &read_tmp); //单次输出2个字节数据
	// 	memcpy(&((uint16_t*)readdata)[i],&read_tmp,2);
	// }

	Protocol_RePort(0x0000, &readdata[0], RD_EEPROM_Param->Len*2);
}

void CMD_NFC_URL_Funtion(__protocol_buf *_Rx)
{
	uint8_t temp[100];
	uint16_t return_sta = 0; //返回状态
	uint16_t return_len = 0; //返回长度

// 	memcpy(temp,"\x00\x00\x06\x10\x6c\x00\x00\x00\x00\x00\x02\x01\x01\x10\x31\x31\x30\x34\x19",19);
// 	memcpy(&temp[19], mt3yverson, sizeof(mt3yverson) - 1);
// 	return_len = sizeof(mt3yverson) - 1 + 19;
	return_len = 1;
	zw0906_ps_getimage(&temp[0]);
	if(temp[0] == 0)
	{
		temp[0] = 0xFF;
		zw0906_ps_genchar(&temp[0]);
	}
	if(temp[0] == 0)
	{
		temp[0] = 0xFF;
		zw0906_ps_search(&temp[0]);
	}
	if(temp[0] == 0)
	{
		return_len = 5;
	}
	Protocol_RePort(return_sta, &temp[0], return_len);
}
